package com.eugenema.handler;

import java.util.*;
import com.eugenema.entity.TestStep;
import com.eugenema.util.ConfigUtil;
import com.eugenema.util.SeleniumUtil;
import org.openqa.selenium.Keys;
import org.openqa.selenium.interactions.Actions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * windows 系统处理器
 *
 * @author Eugenema
 * @date 2023/3/11 13:33
 *
 **/
public class WindowsSystemHandler {
	private static Logger logger = LoggerFactory.getLogger(WindowsSystemHandler.class);

	private static final String FILE_NAME_SPLIT = ";";

	/**
	 * 模拟点击 Windows 系统键盘普通按键,例如：Home 键
	 *
	 * @author Eugenema
	 * @date 2023/3/11 13:33
	 *
	 * @param testStep 动作
	 *
	 **/
	public void windowsKeySg(TestStep testStep) {
		Actions action = new Actions(SeleniumUtil.getDriver());
	    action.sendKeys(Keys.valueOf(testStep.getKey())).perform();
	}
	
	/**
	 * 模拟点击 Windows 系统键盘组合按键,例如：Ctrl + W
	 *
	 * @author Eugenema
	 * @date 2023/3/11 13:39
	 *
	 * @param testStep 动作
	 *
	 **/
	public void windowsKeyCb(TestStep testStep) {
		Actions action = new Actions(SeleniumUtil.getDriver());
		action.keyDown(Keys.valueOf(testStep.getKey())).sendKeys(testStep.getValue()).perform();
	}

	/**
	 * 模拟点击 Windows 系统键盘特殊组合按键,例如：Ctrl + Tab
	 *
	 * @author Eugenema
	 * @date 2023/3/11 13:51
	 *
	 * @param testStep 动作
	 *
	 **/
	public void windowsKeyCbSc(TestStep testStep) {
		Actions action = new Actions(SeleniumUtil.getDriver());
		action.keyDown(Keys.valueOf(testStep.getKey())).sendKeys(Keys.valueOf(testStep.getKeys()))
				.keyUp(Keys.valueOf(testStep.getKey())).sendKeys(Keys.valueOf(testStep.getKeys()))
				.perform();
	}

	/**
	 * 模拟点击 Windows 系统键盘多重特殊组合按键,例如：Ctrl + Shift + K
	 *
	 * @author Eugenema
	 * @date 2023/3/11 13:54
	 *
	 * @param testStep 动作
	 *
	 **/
	public void windowsKeyCbs(TestStep testStep) {
		Actions action = new Actions(SeleniumUtil.getDriver());
		action.keyDown(Keys.valueOf(testStep.getKey())).sendKeys(Keys.valueOf(testStep.getKeys())).sendKeys(testStep.getValue())
				.keyUp(Keys.valueOf(testStep.getKey())).sendKeys(Keys.valueOf(testStep.getKeys())).sendKeys(testStep.getValue())
				.perform();
	}

	/**
	 * 模拟操作切换浏览器到当前最新窗口
	 *
	 * @author Eugenema
	 * @date 2023/3/11 13:57
	 *
	 * @param testStep 动作
	 *
	 **/
	public void windowsCutNew(TestStep testStep) {
		//得到当前所有窗口的处理器
		Set<String> WindowHandle = SeleniumUtil.getDriver().getWindowHandles();
		List<String> WindowHandleList = new ArrayList<>(WindowHandle);

		//切换浏览器到当前最新窗口
		SeleniumUtil.getDriver().switchTo().window(WindowHandleList.get(WindowHandleList.size() - 1));
	}

	/**
	 * 根据索引，模拟操作切换浏览器到指定窗口
	 * 0 表示第一个窗口，1 表示第二窗口
	 *
	 * @author Eugenema
	 * @date 2023/3/11 14:01
	 *
	 * @param testStep 动作
	 *
	 **/
	public void windowsCutByIndex(TestStep testStep) {
		//得到当前所有窗口的处理器
		Set<String> WindowHandle = SeleniumUtil.getDriver().getWindowHandles();
		List<String> WindowHandleList = new ArrayList<>(WindowHandle);

		//切换到浏览器指定窗口中，0表示第一个窗口，1表示第二窗口
		SeleniumUtil.getDriver().switchTo().window(WindowHandleList.get(Integer.parseInt(testStep.getValue())));
	}

	/**
	 * 模拟执行 Windows 系统的 cmd 命令
	 *
	 * @author Eugenema
	 * @date 2023/3/11 14:02
	 *
	 * @param testStep 动作
	 *
	 **/
	public void windowsCmd(TestStep testStep) throws Exception{
		Runtime.getRuntime().exec(new String[]{"cmd", "/c", testStep.getValue()});
	}

	/**
	 * 打开多个 Excel 文件
	 * 读取 testStep 的 value 属性指定的文件名（多个文件以分号分割），路径为配置文件中的 excel_output_path 指定的路径
	 *
	 * @author Eugenema
	 * @date 2023/3/21 22:34
	 *
	 * @param testStep 动作
	 *
	 **/
	public void cmdOpenExcelFile(TestStep testStep) throws Exception{
		String value = testStep.getValue();
		String[] excelFilePaths = value.split(FILE_NAME_SPLIT);

		//拼接命令
		StringBuilder cmd = new StringBuilder();
		/** excel 文件存储路径 */
		String excelOutPutPath = ConfigUtil.getProperty(ConfigUtil.EXCEL_OUTPUT_PATH);
		for (String filePath : excelFilePaths) {
			cmd.append("start \"\" \"" + excelOutPutPath + filePath + "\" && ");
		}
		cmd.delete(cmd.length() - 4, cmd.length());
		logger.debug("生成的 cmd 命令为：{}", cmd);

		testStep.setValue(cmd.toString());
		//执行
		windowsCmd(testStep);
	}
}
